from rest_framework import serializers
from rest_framework.exceptions import ValidationError

from api import models
import re

from rest_framework_jwt.utils import jwt_encode_handler, jwt_payload_handler


class LoginModelSerializer(serializers.ModelSerializer):
    username = serializers.CharField(max_length=32)

    class Meta:
        """
        {
        "username": [
            "已存在一位使用该名字的用户。"
                    ]
        }
        """
        model = models.User
        fields = ['username', 'password']
        # 出现注释里面的情况是因为 username没有被覆盖，走不到validate方法，内部校验就不会通过

    def validate(self, attrs: dict):
        print(self.context)
        # 在这里做检验，写逻辑
        username = attrs.get('username')  # 用户名有三种方式
        password = attrs.get('password')
        # 通过username数据不同，查询参数不同
        # 通过正则匹配
        if re.match(r'^1[3-9][0-9]{9}', username):
            user = models.User.objects.filter(mobile=username).first()
        elif re.match(r'^.+@.+$', username):
            user = models.User.objects.filter(email=username).first()
        else:
            user = models.User.objects.filter(username=username).first()
        if user:
            # 校验密码
            if user.check_password(raw_password=password):
                # 校验通过，签发token
                payload = jwt_payload_handler(user)  # 传入user，得到payload
                token = jwt_encode_handler(payload)  # 传入payload 得到token)
                # 视图函数走完is_valid方法后，给login_ser对象添加一个token，可以用以下方式，但推荐用self.context
                # self.token = token
                self.context['token'] = token
                self.context['user'] = user.username
                print(self.context)
                return attrs
            else:
                raise ValidationError('密码错误')
        else:
            raise ValidationError('用户不存在')

